package x.ovo.wechat.bot.common.plugin;

import x.ovo.wechat.bot.common.Manager;

import java.io.File;
import java.util.Collection;
import java.util.Set;

/**
 * 插件管理器
 *
 * @author ovo, created by 2024/05/01
 */
public interface PluginManager extends Manager {
    /**
     * 初始化
     */
    void init();

    /**
     * 加载插件
     *
     * @param pluginName 插件名字
     */
    void loadPlugin(String pluginName);

    /**
     * 加载插件
     *
     * @param file 文件
     */
    void loadPlugin(File file);

    /**
     * 卸载插件
     *
     * @param name 名字
     */
    void unloadPlugin(String name);

    /**
     * 卸载插件
     *
     * @param plugin 插件
     */
    void unloadPlugin(Plugin plugin);

    /**
     * 启用插件
     *
     * @param pluginName   插件名字
     * @param fromUserName 指令来源用户名
     */
    void enablePlugin(String pluginName, String fromUserName);

    /**
     * 禁用插件
     *
     * @param pluginName   插件名字
     * @param fromUserName 指令来源用户名
     */
    void disablePlugin(String pluginName, String fromUserName);

    /**
     * 获取所有插件名称
     *
     * @return {@link Collection}<{@link String}>
     */
    Collection<String> getPlugins();

    /**
     * 获取插件
     *
     * @param name 名字
     * @return {@link Plugin }
     */
    Plugin getPlugin(String name);

    /**
     * 群聊中是否启用插件
     *
     * @param groupName 组名称
     * @param plugin    插件
     * @return boolean
     */
    boolean isGroupEnabled(String groupName, Plugin plugin);

    /**
     * 获取群聊插件列表
     *
     * @param groupName 组名称
     * @return {@link Set }<{@link String }>
     */
    Set<String> listGroupPlugins(String groupName);

    /**
     * 保存配置
     */
    void saveConfig();
}
